﻿using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
using SqlSugar.IOC;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;

namespace Flies.SQLSugarCore.Tool
{
    public static class SqlSugarServiceCollectionExtensions
    {
        public static void AddSqlSugar(this ServiceConfigurationContext context, List<IocConfig> configs)
        {
            context.Services.AddSingleton<ISqlSugarClient>(provider =>
            {
                // 创建SqlSugarScope（线程安全）
                var sqlSugar = new SqlSugarScope(configs.Select(c => new ConnectionConfig
                {
                    ConfigId = c.ConfigId,
                    ConnectionString = c.ConnectionString,
                    DbType = (DbType)c.DbType,
                    IsAutoCloseConnection = c.IsAutoCloseConnection,
                    InitKeyType = InitKeyType.Attribute
                }).ToList(),
                    db =>
                    {
                        // 全局配置（AOP、日志等）
#if DEBUG
                        db.Aop.OnLogExecuting = (sql, pars) =>
                        {
                            Console.WriteLine($"SQL: {sql}");
                            Console.WriteLine($"Params: {string.Join(",", pars.Select(p => $"{p.ParameterName}={p.Value}"))}");
                        };
#endif

                        // 多租户处理
                        ConfigureMultiTenancy(db, provider);
                    });
                return sqlSugar;
            });
        }

        private static void ConfigureMultiTenancy(SqlSugarClient db, IServiceProvider provider)
        {
            var currentTenant = provider.GetService<ICurrentTenant>();

            if (currentTenant != null)
            {
                // 获取当前租户ID（多租户模式下）
                var tenantId = currentTenant.Id?.ToString();

                if (!string.IsNullOrEmpty(tenantId))
                {
                    // 如果租户数据库存在，则切换到该租户的数据库
                    if (db.AsTenant().IsAnyConnection(tenantId))
                    {
                        db.ChangeDatabase(tenantId);
                    }
                    else
                    {
                        // 租户专属数据库不存在，使用默认数据库
                        db.ChangeDatabase("Default");
                    }
                }
                else
                {
                    // 非多租户模式或未设置租户，使用默认数据库
                    db.ChangeDatabase("Default");
                }
            }
        }
    }
}